package com.example.test.代理模式;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description 代理模式是实现对一个类的访问的控制
 * @Author FL
 * @Date 10:11 2021/4/22
 * @Param
 **/
public class DailiClass {



    public static void main(String[] args) {

        // 获得真实对象
        DailiService dailiService = new DailiServiceImpl();

        /**
         * @Description
         * @Author FL
         * @Date 10:09 2021/4/22
         * @Param [args]  newProxyInstance   (类加载器,被代理类,代理拦截 )
         **/
        DailiService chifan = (DailiService)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{DailiService.class}, new InvocationHandler() {

            /**
             * @Description
             * @Author FL
             * @Date 10:09 2021/4/22
             * @Param [proxy, method, args] 代理类  执行方法  方法参数
             **/
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equalsIgnoreCase("chifan")) {
                    method.invoke(dailiService, args);
                }
//                if (method.getName().equalsIgnoreCase("shuijiao")) {
//                    method.invoke(dailiService, args);
//                }
                return null;
            }
        });

        chifan.chifan();
        chifan.shuijiao();
        // 只会执行chifan方法,因为另一个方法被拦截,未进行代理
    }
}
